/*************************************************
* 描述: 数字控件
* File：cxispinbox.h
* Author：chenanqi@mozihealthcare.cn
* Date：2025/9/29
* Update：
* ************************************************/
#ifndef CXISPINBOX_H
#define CXISPINBOX_H

#include <QLineEdit>
#include <QScopedPointer>
#include <controls/export.h>

class CxiSpinBoxPrivate;

class CXI_CONTROLS_EXPORT CxiSpinBox : public QLineEdit
{
	Q_OBJECT
	Q_DECLARE_PRIVATE(CxiSpinBox)
	Q_PROPERTY(bool IsAllowNegativeNumber READ isAllowNegativeNumber WRITE setIsAllowNegativeNumber)
	Q_PROPERTY(bool IsString READ isString WRITE setIsString)
	Q_PROPERTY(bool IsDecimal READ isDecimal WRITE setIsDecimal)
	Q_PROPERTY(CxiSpinBox::FormatStyle FormatStyle READ formatStyle WRITE setFormatStyle)
	Q_PROPERTY(CxiSpinBox::NumberEditorStyle NumberEditorStyle READ numberEditorStyle WRITE setNumberEditorStyle)
	Q_PROPERTY(qreal Increment READ increment WRITE setIncrement)
	Q_PROPERTY(QVariant Value READ value WRITE setValue)
	Q_PROPERTY(QVariant minimum READ minimum WRITE setMinimum)
	Q_PROPERTY(QVariant maximum READ maximum WRITE setMaximum)
	Q_PROPERTY(int decimal READ decimal WRITE setDecimal)

public:
	enum FormatStyle
	{
		Default = 0,		// 默认行为
		Currency,			// 千分位
		CurrencyWithSign	// 千分位+前缀
	};
	enum NumberEditorStyle
	{
		Numeric = 0,
		NumericUpDown
	};
	Q_ENUM(FormatStyle)
	Q_ENUM(NumberEditorStyle)

	explicit CxiSpinBox(QWidget* parent = nullptr);
	~CxiSpinBox() override;

	/**
	 * 设置是否允许负数
	 */
	void setIsAllowNegativeNumber(bool isAllowNegativeNumber);
	bool isAllowNegativeNumber() const;

	/**
	 * 设置是否为字符串
	 */
	void setIsString(bool isString);
	bool isString() const;

	/**
	 * 设置是否为小数
	 */
	void setIsDecimal(bool isDecimal);
	bool isDecimal() const;

	/**
	 * 设置数字格式
	 */
	void setFormatStyle(FormatStyle formatStyle);
	CxiSpinBox::FormatStyle formatStyle() const;

	/**
	 * 是否显示右侧上下按钮，默认显示
	 */
	void setNumberEditorStyle(NumberEditorStyle numberEditorStyle);
	NumberEditorStyle numberEditorStyle() const;

	/**
	 * 设置步长
	 */
	void setIncrement(double increment);
	qreal increment() const;

	/**
	 * 获取当前值
	 */
	QVariant value() const;
	void setValue(const QVariant& value);

	/**
	 * 获取最小值
	 */
	QVariant minimum() const;
	void setMinimum(const QVariant& minimum);

	/**
	 * 获取最大值
	 */
	QVariant maximum() const;
	void setMaximum(const QVariant& maximum);

	/**
	 * 获取小数位数
	 */
	int decimal() const;
	void setDecimal(int decimal);
signals:
	void valueChanged(const QVariant& value);
protected:
	/**
	 * 键盘按下事件 允许特定情况下输入0-9的数字，负号，以及小数点。其余忽略
	 * @param event
	 */
	void keyPressEvent(QKeyEvent* event) override;

	/**
	 * 调整右侧箭头的样式 位置
	 */
	void resizeEvent(QResizeEvent* event) override;

	/**
	 * 获取焦点 调整数字样式
	 */
	void focusInEvent(QFocusEvent *) override;

	/**
	 * 失去焦点 调整数字样式
	 */
	void focusOutEvent(QFocusEvent *) override;


private:
	// QScopedPointer<CxiSpinBoxPrivate> d_ptr;
	CxiSpinBoxPrivate* const d_ptr;
};

#endif// CXISPINBOX_H
